<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1.  对象简写

        let name = 'mikaisa';
        // 先看看传统的对象怎么写的
        let person1 = {
            name: name,
            sayName: function () {
                console.log('我是' + this.name);
            }
        }

        // ES6中可以这么写
        let person2 = {
            name,//属性与变量名同名可以只写一个
            sayName() {//属性值是个方法的话，可以直接在属性名后面(){}就可以了
                console.log('我是' + this.name);
            }
        }

        console.log('\n------------------------------\n\n');

        // 2. 对象属性  表达式
        let name2 = 'a';//现在我想让name2这个变量的值作为person3的属性名，我该怎么读取呢？
        let person3 = {
            [name2]:'kerwin',//加个中括号就可以了，会把name2当做一个变量去找值
            [name2+'zz']:'mikaisa',//你也可以利用这点进行字符串拼接，总之很好用就是了
        }
        console.log(person3);//{ a:'kerwin','azz':'mikaisa' }

        console.log('\n------------------------------\n\n');

        // 3. 扩展运算符 ...  其实对象的扩展运算符是ES2018才支持的
        let obj = {
            name:'kerwin'
        }

        let obj1 = {...obj};//和数组一样，对象的扩展运算符也可以对于浅层的对象进行深拷贝，但是多层嵌套的对象就不能深拷贝了。也可以进行对象的合并等操作
        console.log(obj1);

        console.log('\n------------------------------\n\n');

        /*
            4. Object.assign(obj1,obj2,.....)  将参数中的对象进行合并，合并好的对象会直接覆盖obj1，所以该方法会改变第一个参数对象，如果你不想改变参数中的任何一个对象，你可以创建一个空的对象专门用于存放合并后的对象结果
        */ 
        let obj2 = {
            name:'mikaisa'
        }

        let obj3 = {
            age:18
        }

        let obj4 = {
            sex:'男'
        }
        console.log(Object.assign(obj2,obj3,obj4),obj2);
        console.log(Object.assign(obj2,obj3,obj4) == obj2);//true

        console.log('\n------------------------------\n\n');

        /*
            Object.is(param1,param2)  判断param1和param2是否相等
            其实作用和 === 差不多，但是并不完全相同
            但是我们知道js中 NaN === NaN 是会返回false的
            从学术角度我们很容易理解，但是实际开发中我们其实很想他能返回true
            并且 +0 === -0 会返回true (因为js中没有正负0的区分)，而我们其实很想他能返回false
            所以，这就是该方法和 === 的区别
        */ 
       console.log(Object.is(NaN,NaN),NaN===NaN);//true,false
       console.log(Object.is(+0,-0),+0===-0);//false,true
    </script>
</body>

</html>